#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

void *routine(void *arg)
{
    //线程传参
    printf("routine: param(%s)\n", (char *)arg);

    while (1)
    {
        //属于取消点函数
        // sleep(1);

        //无取消点情况下，可主动检查是否取消状态，是则取消。
        pthread_testcancel();
    }

    //被取消时这里不会被执行
    printf("===========\n");

    //线程退出（退出值可为malloc空间指针，到外面释放）
    pthread_exit(arg);
}

int main(int argc, char const *argv[])
{
    //线程id
    printf("main tid(%lu)\n", pthread_self());

    //创建线程
    pthread_t tid;
    const char *param = "hello~";
    if (pthread_create(&tid, NULL, routine, (void *)param) != 0)
    {
        printf("pthread_create error!\n");
        return -1;
    }

    //发送信号0用于检测线程是否还存在
    printf("%d\n", pthread_kill(tid, 0));

    //使在取消点时终止
    pthread_cancel(tid);

    //阻塞等待线程结束
    void *result;
    pthread_join(tid, &result);

    printf("done\n");

    return 0;
}
